package cn.smkt.common.ex;


import cn.smkt.common.vo.R;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

import javax.validation.ConstraintViolationException;

@Slf4j
@RestControllerAdvice
public class GlobalExceptionHandler {
	/**
	 * 第1个异常处理方法:IllegalArgumentException
	 *
	 * @param ex 异常对象
	 * @return JsonResult
	 */
	@ExceptionHandler
	public R doHandleIllegalArgumentException(IllegalArgumentException ex) {
		//获取异常提示消息: ex.getMessage() [微博ID值无效]
		String message = ex.getMessage();
		log.error("IllegalArgumentException: " + message);

		return R.error(message);
	}

	@ExceptionHandler
	public R handleRRException(RRException e) {
		log.error(e.getMsg());
		R r = new R();

		r.setCode(e.getCode());
		r.setMsg(e.getMsg());

		return r;
	}

	/**
	 * 第2个异常处理方法:RuntimeException
	 *
	 * @param ex 异常处理对象
	 * @return JsonResult
	 */
	@ExceptionHandler
	public R doHandleRuntimeException(RuntimeException ex) {
		ex.printStackTrace();
		String message = ex.getMessage();
		log.error("RuntimeException: " + message);

		return R.error(message);
	}


	/**
	 * 第3个异常处理方法:MethodArgumentNotValidException
	 * ------------专门处理POJO类型校验抛出的异常----------------
	 * 1.Spring Validation框架抛出;
	 * 2.校验POJO类属性时,参数未满足要求.
	 */
	@ExceptionHandler
	public R doHandleMethodArgumentNotValidException(MethodArgumentNotValidException ex) {
		//Validation中,验证POJO类型参数获取提示消息使用: ex.getFieldError().getDefaultMessage() 方法.
		String message = ex.getFieldError().getDefaultMessage();
		log.error("MethodArgumentNotValidException: " + message);

		return R.error(message);
	}

	/**
	 * 第4个异常处理方法:ConstraintViolationException
	 * ------------专门处理声明参数方式验证框架校验抛出的异常----------------
	 * 1.Spring Validation框架抛出;
	 * 2.声明参数方式接收数据校验时,参数未满足要求.
	 */
	@ExceptionHandler
	public R doHandleConstraintViolationException(ConstraintViolationException ex) {
		// selectById.id: 微博ID必须在200-500之间  ---->  微博ID必须在200-500之间
		String message = ex.getMessage().split(":")[1].trim();
		log.error("ConstraintViolationException: " + message);

		return R.error(message);
	}

	@ExceptionHandler
	public R handleException(Exception e) {
		log.error(e.getMessage());
		return R.error("系统繁忙，请稍后重试");
	}
}
